今天挑戰:
這題給了一個很大的 ZIP 檔,flag 就藏在壓縮內容中的某個文字檔裡。
重點不是一次全部解壓(檔案太大),而是先用「列清單 + 不解壓直接檢視」的方式快速搜尋,再對可疑檔案或巢狀壓縮逐層處理,最後用 grep 抓到結果。
解題步驟與思路
一、下載檔案並檢查大小:
wget -O big-zip-files.zip "https://artifacts.picoctf.net/c/504/big-zip-files.zip"
ls -lh big-zip-files.zip
確認檔案有下載完整、大小合理(避免中途斷線或損毀)。
二、先列出 ZIP 內檔案清單(不解壓):
unzip -l big-zip-files.zip | sed -n '1,40p'
這樣可以先了解結構(是否有大量巢狀 .zip/.tar、或很多 .txt/.md 檔),避免盲目全部展開造成磁碟壓力。
三、在壓縮檔內逐檔檢索 picoCTF:
for f in $(zipinfo -1 big-zip-files.zip); do
unzip -p big-zip-files.zip "$f" 2>/dev/null | grep -a -n "picoCTF{" && echo "FOUND IN: $f" && break
done
unzip -p 可以把壓縮裡單一檔案輸出到 stdout,搭配 grep -a(把二進位也當文字搜索)能在不解壓到硬碟的情況下直接檢查內容。執行上步驟是無法找到答案ㄉ。
四、解到工作資料夾,逐層解壓並搜尋:
shopt -s globstar nullglob
while true; do
found=0
for z in **/*.zip; do
[ -f "$z" ] || continue
d="${z%.*}"
mkdir -p "$d"
unzip -oq "$z" -d "$d" && echo "unzipped $z -> $d"
rm -f "$z"
found=1
done
for t in **/*.tar.gz **/*.tgz **/*.tar.bz2 **/*.tar.xz **/*.tar; do
[ -f "$t" ] || continue
d="${t%.*}"
mkdir -p "$d"
tar -xf "$t" -C "$d" && echo "untarred $t -> $d"
rm -f "$t"
found=1
done
[ "$found" -eq 1 ] || break
done
grep -R -n --binary-files=text "picoCTF{" . | sed -n '1,100p'
系統會跑出一大堆亂碼,然後在最後面就會看到本題的Flag了!!
小小心得
面對大壓縮檔,先「看」再「動手」:可以使用unzip -l / zipinfo 快速了解內容。
用 unzip -p + grep 可以快速在壓縮內搜尋,不必把檔案寫到硬碟。
遇到巢狀壓縮,採「逐層拆解」的策略,必要時用腳本自動化但要小心空間。
若 flag 看起來是亂碼或藏在二進位,試 strings、base64 -d、或 exiftool 等工具檢查內嵌資料。
這題練到的不是複雜演算法,而是檔案處理與命令列思維,如何在龐大資料裡有效率地搜尋、如何利用工具管線(pipeline)減少 I/O 與儲存成本,和如何安全地遞迴處理巢狀檔案。